package com.dwy2002.common.utils;


import com.dwy2002.common.exception.EmptyIdException;
import com.dwy2002.pojo.vo.UploadImagesVO;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 通用工具类
 *
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/01/18
 */
public class Utils {
    /**
     * 从请求头中获取并返回token信息
     *
     * @return 返回从请求头中获取的token信息
     * @author 杜伟毅
     * @since 2025/1/17 0017 23:41
     */
    public static String getToken() {
        // 获取当前请求的HttpServletRequest,拿到请求头里的token
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        return request.getHeader("Authorization");
    }

    /**
     * 判断一个字符串是否为空字符串、为null
     *
     * @param str 要判断的字符串
     * @return true 为空或为null，false 不为空
     * @author 杜伟毅
     * @since 2025/1/18 0018 17:34
     */
    public static boolean isEmptyOrNull(String str) {
        return str == null || str.trim().isEmpty();
    }

    /**
     * 判断一个id是否为空字符串、为null
     *
     * @param id          要判断的id
     * @param paramMethod 提示是那个方法的id
     * @author 杜伟毅
     * @since 2025/1/18 0018 17:34
     */
    public static void validateIdNotEmpty(String id, String paramMethod) {
        if (isEmptyOrNull(id)) throw new EmptyIdException(paramMethod);
    }

    /**
     * 判断一个id集合是否为空字符串、为null
     *
     * @param ids         要判断的id
     * @param paramMethod 提示是那个方法的id
     * @author 杜伟毅
     * @since 2025/1/18 0018 17:34
     */
    public static void validateIdsNotEmpty(List<String> ids, String paramMethod) {
        if (isListEmpty(ids)) throw new EmptyIdException(paramMethod);
    }

    /**
     * 判断 MultipartFile 是否为空
     *
     * @param file 上传的文件
     * @return true 表示文件为空，false 表示文件不为空
     * @since 2025/1/19 0019 13:17
     */
    public static boolean isFileEmpty(MultipartFile file) {
        return file == null || file.isEmpty() || file.getOriginalFilename().trim().isEmpty() || file.getSize() == 0;
    }

    /**
     * 用于BigDecimal类判空或0
     *
     * @param num BigDecimal 需要判断的数
     * @return true：为0或null，false：不为0或null
     * @author 杜伟毅
     * @since 2025/1/21 0021 22:24
     */
    public static boolean isBigDecimalEmpty(BigDecimal num) {
        return num == null || num.compareTo(BigDecimal.ZERO) == 0;
    }

    /**
     * 当前数值是否与课程容量匹配
     *
     * @param enrolledCount Integer 表示课程当前已经报名的人数
     * @param peopleLimit   Integer 表示当前课程的限制人数
     * @return true：课程人数还在范围内，false：课程人数不在范围内
     * @author 杜伟毅
     * @since 2025/1/22 0022 23:48
     */
    public static boolean equalsCourseLimit(Integer enrolledCount, Integer peopleLimit) {
        if (peopleLimit < -1) {
            return false;
        }
        if (peopleLimit == -1) {
            return true;
        }
        return peopleLimit > enrolledCount;
    }

    /**
     * 判断一个 List 是否为空
     *
     * @param list 要检查的 List
     * @param <T>  泛型类型
     * @return true：如果列表为 null 或者列表中没有元素，返回，否则返回 false
     * @author 杜伟毅
     * @since 2025/2/12 0012 22:34
     */
    public static <T> boolean isListEmpty(List<T> list) {
        return list == null || list.isEmpty();
    }

    /**
     * 保存上传的图片链接到图片返回类
     *
     * @param imagesList 图片集合
     * @return 返回图片链接集合
     * @author 杜伟毅
     * @since 2025/2/28 0028 18:50
     */
    public static List<UploadImagesVO> saveImagesToList(List<String> imagesList) {
        return imagesList.stream()
                .map(image -> {
                    UploadImagesVO uploadImagesVO = new UploadImagesVO();
                    uploadImagesVO.setImageUrl(image);
                    return uploadImagesVO;
                })
                .collect(Collectors.toList());
    }

    /**
     * 检测page数据是否为空
     *
     * @param pageNo   页数
     * @param pageSize 展示数据条数
     * @return true:为null false：不为null
     * @author 杜伟毅
     * @since 2025/3/1 0001 22:46
     */
    public static Boolean isPageNull(Long pageNo, Long pageSize) {
        return pageNo == null && pageSize == null;
    }

    /**
     * 检测page数据是否为0
     *
     * @param pageNo   页数
     * @param pageSize 展示数据条数
     * @return true:为0 false：不为0
     * @author 杜伟毅
     * @since 2025/3/1 0001 22:49
     */
    public static Boolean isPageZero(Long pageNo, Long pageSize) {
        return pageNo == 0 && pageSize == 0;
    }
}
